package com.dongpu.springboot.rabbitmq.utils;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.UUID;

import org.apache.commons.lang3.StringUtils;

/**
 * @author biyuyang
 */
public class SvcUtil {


	private static final double EARTH_RADIUS = 6378.137;
	// 将固定符号间隔的字符串转list
	public static List<String> string2List(String info, String seed) {
		List<String> set = new ArrayList<String>();
		if (!StringUtils.isBlank(info)) {
			String[] menus = info.split(seed);
			for (String str : menus) {
				set.add(str);
			}
		}
		return set;
	}

	public static String getUUID() {
		String s = UUID.randomUUID().toString();
		// 去掉“-”符号
		return s.substring(0, 8) + s.substring(9, 13) + s.substring(14, 18)
			+ s.substring(19, 23) + s.substring(24);
	}

	/**
	 * 将时间转换为int表现形式
	 *
	 * @param time
	 * @return
	 */
	public static int convertDate2Int4Day(Date time) {
		return Integer.parseInt(formatDate(time, "yyyyMMdd"));
	}

	public static String formatDate(Date date, String style) {
		if (style == null) {
			style = "yyyy-MM-dd";
		}
		if (date == null) {
			// date = new Date();
			return "";
		}
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat(style);
		return simpleDateFormat.format(date);
	}

	/**
	 * 得到相对今天的前x天, x可正可负 正数是明天，负数是昨天
	 *
	 * @param value
	 *            int 前x天
	 * @return Date
	 */
	public static Date getDate(int value) {
		return getDate(new Date(), value);
	}

	// 以date为基准前后x天的date
	public static Date getDate(Date date, int value) {
		GregorianCalendar calendar = new GregorianCalendar();
		calendar.setTime(new Timestamp(date.getTime()));
		if (value != 0) {
			calendar.add(Calendar.DAY_OF_MONTH, value);
		}
		return new Date(calendar.getTimeInMillis());
	}

	/**
	 * 字符串改set（可实现去重效果）
	 *
	 * @param info
	 * @param seed
	 * @return
	 */
	public static Set<String> string2Set(String info, String seed) {
		Set<String> set = new HashSet<String>();
		if (StringUtils.isNotBlank(info)) {
			String[] menus = info.split(seed);
			for (String str : menus) {
				set.add(str);
			}
		}
		return set;
	}

	/**
	 * 执行某类的静态方法
	 *
	 *            类名
	 * @param methodName
	 *            方法名
	 * @param args
	 *            参数数组
	 * @return 执行方法返回的结果
	 * @throws Exception
	 */
	@SuppressWarnings("unchecked")
	public static Object invokeStaticMethod(Class ownerClass, String methodName, Object[] args) throws Exception {
		Class[] argsClass = new Class[0];
		if (args != null && args.length > 0) {
			argsClass = new Class[args.length];
			for (int i = 0, j = args.length; i < j; i++) {
				argsClass[i] = args[i].getClass();
			}
		}
		return ownerClass.getMethod(methodName, argsClass).invoke(null, args);
	}

	/**
	 * 修改类的静态属性值
	 *            类名
	 *            方法名
	 *            参数数组
	 * @return 执行方法返回的结果
	 * @throws Exception
	 */
	public static void setStaticValue(Class ownerClass, String name, Object value) throws Exception {
		Field[] fields = ownerClass.getDeclaredFields();
		for (Field field : fields) {
			if (Modifier.isStatic(field.getModifiers())) {
				if (field.getName().equals(name)) {
					field.set(null, value);
					break;
				}
			}
		}
	}

	/**
	 * 通过经纬度获取距离(单位：米)
	 *
	 * @param lat1 纬度1
	 * @param lng1 经度1
	 * @param lat2 纬度2
	 * @param lng2 经度2
	 * @return 距离
	 */
	public static double getDistance(double lat1, double lng1, double lat2,
		double lng2) {
		double radLat1 = rad(lat1);
		double radLat2 = rad(lat2);
		double a = radLat1 - radLat2;
		double b = rad(lng1) - rad(lng2);
		double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2)
			+ Math.cos(radLat1) * Math.cos(radLat2)
			* Math.pow(Math.sin(b / 2), 2)));
		s = s * EARTH_RADIUS;
		s = Math.round(s * 10000d) / 10000d;
		s = s * 1000;
		return s;
	}

	private static double rad(double d) {
		return d * Math.PI / 180.0;
	}

	/**
	 * 截取指定位数的字符串
	 * @param value
	 * @return String
	 */
	public static String subStringEx(String value,int count) {
		int length = value.length();
		if(length>count){
			return value.substring(0, count);
		}else{
			return value;
		}
	}
}
